package com.sd.jd.record_test;

/**
 * Java 17 引入了 record 关键字，用于定义不可变的、轻量级的类，主要用于存储数据。record 类自动生成了一些常用的方法，比如构造函数、equals、hashCode 和 toString，从而减少了手动编写这些代码的必要性。<br/>
 * 在下面的示例中，Person 是一个 record 类，它有两个组件：name 和 age。<br/>
 * 当你创建一个 record 类时，编译器会自动为你生成一个构造器，这个构造器接受与组件相同数量和类型的参数。<br/>
 * 同时，编译器还会为你生成 equals、hashCode 和 toString 方法。这些自动生成的方法都使用了组件的值。<br/>
 *
 * 你可以像使用普通方法一样使用组件名，但需要在组件名后添加一对括号 ()，如 name() 和 age()。<br/>
 * 这是为了与普通的字段访问区分开，因为 record 类的组件实际上是不可变的。<br/>
 *
 * record 类的主要优点是减少了样板代码的数量，使代码更加简洁易读。<br/>
 * 同时，由于 record 类是不可变的，它们自然就是线程安全的，并且可以作为 Map 的键或用于其他需要不可变性的场景。<br/>
 *
 * 需要注意的是，record 类中的组件默认是 final 的，这意味着它们的值在创建 record 对象后就不能再被修改。
 * 如果需要额外的字段或方法，可以像普通的类一样在 record 类中定义它们。<br/>
 */
public class RecordTest {

    // 定义一个名为 Person 的 record 类
    public record Person(String name, int age) {
        // 这里可以定义额外的方法或字段，但通常 record 类是简单的数据载体

        // 例如，可以定义一个方法来获取全名（虽然这不是必需的，因为字段可以直接访问）
        public String getFullName() {
            return name; // 假设名字就是全名
        }
    }

    // 使用 Person record 类
    public static void main(String[] args) {
        // 创建 Person record 对象
        Person alice = new Person("Alice", 30);

        // 访问字段
        System.out.println("Name: " + alice.name()); // 使用 name() 方法访问字段
        System.out.println("Age: " + alice.age());   // 使用 age() 方法访问字段

        // 调用额外的方法
        System.out.println("Full Name: " + alice.getFullName());

        // record 类自动生成的 toString 方法
        System.out.println(alice); // 输出类似 "Person[name=Alice, age=30]"

        // record 类自动生成的 equals 和 hashCode 方法
        Person bob = new Person("Alice", 30);
        System.out.println(alice.equals(bob)); // 输出 true，因为两个 Person 对象相等

        System.out.println(alice.name);
    }
}
